package cn.epsilon3.utils;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.epsilon3.constant.Base;
import cn.epsilon3.domain.e3.po.AccountInfo;
import cn.epsilon3.domain.e3.po.Fa;
import cn.epsilon3.domain.e3.po.Principal;
import cn.epsilon3.domain.e3.po.Role;
import cn.epsilon3.exception.Epsilon3Exception;

/**
 * <p>
 * 账户安全工具类
 * </p>
 *
 * @author epsilon3
 * @since 2023-08-13
 */
public class SecurityUtils {

    /**
     * 在没有设置sa-token的token-name时，将用此值替代redis key root
     */
    private static String BASE_REDIS_ROOT = "e3";

    /**
     * 获取当前账户信息
     *
     * @return AccountInfo
     */
    public static AccountInfo currentAccount() {
        AccountInfo accountInfo = (AccountInfo) WebUtils.getSessionValue(Base.E3_AUTH_INFO_SESSION);
        if (ObjectUtil.isNull(accountInfo)) {
            accountInfo = (AccountInfo) WebUtils.getSaSessionValue(Base.E3_AUTH_INFO_SESSION);
        }
        if (ObjectUtil.isNull(accountInfo)) {
            throw new Epsilon3Exception("用户未登陆");
        }
        return accountInfo;
    }

    /**
     * 获取账户主体信息
     *
     * @return 主体信息
     */
    public static Principal principal() {
        return currentAccount().getPrincipal();
    }

    /**
     * 获取账户角色信息
     *
     * @return 角色信息
     */
    public static Role role() {
        return currentAccount().getRole();
    }

    /**
     * 获取账户2FA信息
     *
     * @return 2FA信息
     */
    public static Fa fa() {
        return currentAccount().getFa();
    }

    public static String generateRedisKey(String key) {
        String root = StpUtil.getTokenName();
        if (StrUtil.isBlank(root)) {
            root = BASE_REDIS_ROOT;
        }
        return root + key;
    }
}
